home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / mcite / mcite.dtx (.txt) < prev    next >
LaTeX Document  |  1995-03-09  |  14KB  |  381 lines

  1. % \iffalse % mcite.dtx - multiple citations on one key
  2. % Copyright (C) 1994 by Thorsten.Ohl@Physik.TH-Darmstadt.de
  3. % /home/sources/ohl/tex/mcite/mcite.dtx,v 1.5 1994/08/18 14:22:26 ohl Exp
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. % Mcite is free software; you can redistribute it and/or modify it
  6. % under the terms of the GNU General Public License as published by 
  7. % the Free Software Foundation; either version 2, or (at your option)
  8. % any later version.
  9. % Mcite is distributed in the hope that it will be useful, but
  10. % WITHOUT ANY WARRANTY; without even the implied warranty of
  11. % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  12. % GNU General Public License for more details.
  13. % You should have received a copy of the GNU General Public License
  14. % along with this program; if not, write to the Free Software
  15. % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. % \fi
  18. %% \CheckSum{206}
  19. %% \CharacterTable
  20. %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
  21. %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
  22. %%   Digits        \0\1\2\3\4\5\6\7\8\9
  23. %%   Exclamation   \!     Double quote  \"     Hash (number) \#
  24. %%   Dollar        \$     Percent       \%     Ampersand     \&
  25. %%   Acute accent  \'     Left paren    \(     Right paren   \)
  26. %%   Asterisk      \*     Plus          \+     Comma         \,
  27. %%   Minus         \-     Point         \.     Solidus       \/
  28. %%   Colon         \:     Semicolon     \;     Less than     \<
  29. %%   Equals        \=     Greater than  \>     Question mark \?
  30. %%   Commercial at \@     Left bracket  \[     Backslash     \\
  31. %%   Right bracket \]     Circumflex    \^     Underscore    \_
  32. %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
  33. %%   Right brace   \}     Tilde         \~}
  34. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  35. % \MakeShortVerb{\|}
  36. % \title{%
  37. %   \MCITE/: \\
  38. %   Multiple Citations on One Key}
  39. % \author{%
  40. %   Thorsten Ohl\thanks{e-mail:
  41. %     \texttt{Thorsten.Ohl@Physik.TH-Darmstadt.de}}\\
  42. %   \hfil \\
  43. %   Technische Hochschule Darmstadt \\
  44. %   Schlo\ss gartenstr. 9 \\
  45. %   D-64289 Darmstadt \\
  46. %   Germany}
  47. % \maketitle
  48. % \begin{abstract}
  49. %   This \LaTeXe{} package provides support for collapsing multiple
  50. %   citations into one, as custumoary in physics journals.
  51. % \end{abstract}
  52. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  53. % \tableofcontents
  54. % \unitlength=1mm
  55. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  56. % \section{Introduction}
  57. % Imagine we want to refer to the standard
  58. % model~\cite{Glashow,*Salam,*Weinberg} of particle physics.  Instead
  59. % of the standard \BibTeX{}~\cite{btxdoc,*btxhak} format
  60. % \begin{itemize}
  61. %   \bitem{1} Sheldon Glashow. Partial symmetries of weak interactions.
  62. %     {\em Nucl.~Phys.}, 22:579, 1961.
  63. %   \bitem{2} Abdus Salam. Weak and electromagnetic interactions.
  64. %     In W.~Svartholm, editor, {\em Elementary Particle Theory}, page 367,
  65. %     Stockholm, 1968. Almquist and Wiksell.
  66. %   \bitem{3} Steven Weinberg.  A model of leptons.
  67. %     {\em Phys.~Rev.~Lett.}, 19:1264, 1967.
  68. % \end{itemize}
  69. % it is customary in physics journals to collapse such references into one
  70. % \begin{itemize}
  71. %   \bitem{1} Sheldon Glashow, Nucl.~Phys.~\textbf{22} (1961) 579; 
  72. %     Abdus Salam, in: W.~Svartholm (ed.), \textit{Elementary
  73. %     Particle Theory}, p.~367, Stockholm, 1968;
  74. %     Steven Weinberg, Phys.~Rev.~Lett.~\textbf{19} (1967) 1264.
  75. % \end{itemize}
  76. % The slight typographyical changes are easily taken care of by
  77. % changing the \BibTeX{} style, i.e.~by using |phaip.bst|.  The hard
  78. % part is to convince \BibTeX{} to collapse the entries.  \MCITE/
  79. % takes care of that.
  80. % \DescribeMacro{\cite}
  81. % This package overloads the \LaTeX{}~\cite{latex,*latex-companion}
  82. % |\cite| command.  All keys starting with a |*| (which should be
  83. % sufficiently unlikely in a \BibTeX{} key) will be added to the
  84. % previous item.  For example the following
  85. % reference~\cite{texbook,latex,*latex-companion,Glashow,*Salam,*Weinberg}
  86. % was created by
  87. % |\cite{texbook,latex,*latex-companion,Glashow,*Salam,*Weinberg}|.
  88. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  89. % \subsection*{Hacking the \BibTeX{} Style}
  90. % With the standard \BibTeX{} styles, it is almost impossible to
  91. % provide proper punctuation (i.e.~``|;|'' between collapsed items).
  92. % In principle one could play tricks with an active ``|.|'', but there
  93. % are too many special cases in real life \BibTeX{} entries that can go
  94. % wrong.  Fortunately, it is fairly easy to customize \BibTeX{} styles
  95. % for our purposes.
  96. % Almost all \BibTeX{} styles known to (wo)mankind contain a function
  97. % \begin{verbatim}
  98. % FUNCTION {fin.entry}
  99. % { add.period$
  100. %   write$
  101. %   newline$
  102. % \end{verbatim}
  103. % removing the |add.period$| and escaping the |newline$| with |\relax|
  104. % will take care of the paragraph breaks and allow \MCITE/ to provide
  105. % the proper punctuation:
  106. % \begin{verbatim}
  107. % FUNCTION {fin.entry}
  108. % { write$
  109. %   "\relax" write$
  110. %   newline$
  111. %   "\relax" write$
  112. % \end{verbatim}
  113. % Note that |%| would be almost as good as |\relax| but the latter
  114. % also works if the |\catcode| of |%| has been changed.
  115. % In the function |begin.bib|, the |\begin{thebibliography}| should be
  116. % replaced by |\begin{mcbibliography}|.  Similary, in |end.bib| the
  117. % |\end{thebibliography}| by |\end{mcbibliography}|.  The
  118. % |mcbibliography| environment will inform \MCITE/ that it has to
  119. % provide the punctuation.
  120. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  121. % \subsection*{Bugs and Deficiencies}
  122. % The following bugs and deficiencies are known:
  123. % \begin{enumerate}
  124. %   \item{} \MCITE/ only works with unsorted bibliography styles.
  125. %     Without modifications to \BibTeX, it seems impossible to support
  126. %     sorted bibliography styles.
  127. %   \item{} \MCITE/'s |\cite| is less forgiving about bogus spaces.
  128. %     This can be fixed.
  129. % \end{enumerate}
  130. % \StopEventually{}
  131. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  132. % \section{Implementation}
  133. % It's is good practice to identify this version of this package.
  134. % We do this by parsing an RCS |Id| string and storing the
  135. % result in the conventional \TeX{} control sequences:
  136. %    \begin{macrocode}
  137. %<*package>
  138. \NeedsTeXFormat{LaTeX2e}
  139. {\def\RCS#1#2\endRCS{%
  140.   \ifx$#1%
  141.     \@RCS $#2 \endRCS
  142.   \else
  143.     \@RCS $*: #1#2$ \endRCS
  144.   \fi}%
  145.  \def\@RCS $#1: #2,v #3 #4 #5 #6$ \endRCS{%
  146.    \gdef\filename{#2}%
  147.    \gdef\fileversion{v#3}%
  148.    \gdef\filedate{#4}%
  149.    \gdef\docdate{#4}}%
  150. \RCS mcite.dtx,v 1.5 1994/08/18 14:22:26 ohl Exp \endRCS}%
  151. %    \end{macrocode}
  152. % And now the standard procedure:
  153. %    \begin{macrocode}
  154. \ProvidesPackage{mcite}[\filedate\space multiple citations]
  155. \typeout{Package: `mcite'
  156.    \fileversion\space <\filedate> (tho) PRELIMINARY TEST RELEASE}
  157. \wlog{English documentation \@spaces<\docdate> (tho)}
  158. %    \end{macrocode}
  159. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  160. % \subsection{Collecting Information}
  161. %    \begin{macrocode}
  162. \def\@enamedef#1{\expandafter\edef\csname #1\endcsname}
  163. %    \end{macrocode}
  164. %    \begin{macrocode}
  165. \def\mc@single#1{\global\@enamedef{mc*sg*#1}{}}
  166. \def\mc@head#1#2{\global\@enamedef{mc*hd*#1}{#2}}
  167. \def\mc@tail#1#2{\global\@enamedef{mc*tl*#1}{#2}}
  168. %    \end{macrocode}
  169. %    \begin{macrocode}
  170. \def\mc@ifsingle#1#2#3{\@ifundefined{mc*sg*#1}{#3}{#2}}
  171. \def\mc@ifhead#1#2#3{\@ifundefined{mc*hd*#1}{#3}{#2}}
  172. \def\mc@iftail#1#2#3{\@ifundefined{mc*tl*#1}{#3}{#2}}
  173. %    \end{macrocode}
  174. %    \begin{macrocode}
  175. \def\mc@thehead#1{\@nameuse{mc*tl*#1}}
  176. \def\mc@thetail#1{\@nameuse{mc*hd*#1}}
  177. %    \end{macrocode}
  178. % \begin{macro}{\cite}
  179. % We are overloading the original |\cite| command such that
  180. % |\cite{latex,*latex-companion,texbook}| will give
  181. % ``\cite{latex,*latex-companion,texbook}''.
  182. %    \begin{macrocode}
  183. \let\orig@cite\cite
  184. \def\cite{%
  185.   \@ifnextchar[%
  186.     {\PackageWarning{mcite}%
  187.        {optional argument to \protect\cite\space not supported}%
  188.      \@tempswatrue
  189.      \expandafter\mc@citex\mc@gobbleopt}%
  190.     {\@tempswatrue
  191.      \mc@cite}}
  192. %    \end{macrocode}
  193. % \end{macro}
  194. % Gobble up all optional arguments
  195. %    \begin{macrocode}
  196. \def\mc@gobbleopt[#1]{}
  197. %    \end{macrocode}
  198. % \begin{macro}{\mc@cite}
  199. % First of all: expand the argument: 
  200. %    \begin{macrocode}
  201. \def\mc@cite#1{%
  202.   \edef\mc@temp{#1}%
  203.   \expandafter\mc@cite@\expandafter{\mc@temp}}
  204. %    \end{macrocode}
  205. % Here we do the actual ``preprocessing'' of the |\cite| keys.
  206. %    \begin{macrocode}
  207. \def\mc@cite@#1{%
  208.   \mc@firsttrue
  209.   \@for\mc@@@:=#1\do{%
  210. %    \end{macrocode}
  211. % It the key starts with a |*|, mark it as tail.  Otherwise mark it as
  212. % head.
  213. %    \begin{macrocode}
  214.     \expandafter\mc@ifstar\mc@@@\sentinel%
  215.       {\ifmc@first
  216.          \PackageWarning{mcite}%
  217.            {tail `\mc@key' appears as first item in \protect\mcite}%
  218.          \mc@dohead
  219.        \else
  220.          \mc@dotail
  221.        \fi}%
  222.       {\mc@dohead}%
  223. %    \end{macrocode}
  224. % Write a |\citation| command to the |.aux| file in any case.  This
  225. % gives some duplication but keeps things in order.
  226. %    \begin{macrocode}
  227.     \if@filesw
  228.       \immediate\write\@auxout{\string\citation{\mc@key}}%
  229.     \fi}%
  230.   \expandafter\orig@cite\expandafter{\mc@list}}
  231. %    \end{macrocode}
  232. % \end{macro}
  233. %    \begin{macrocode}
  234. \def\mc@dohead{%
  235.   \mc@iftail{\mc@key}%
  236.     {\PackageWarning{mcite}%
  237.        {head `\mc@key' already used as tail of `\mc@thehead{\mc@key}'}}%
  238.     {}%
  239.   \mc@head{\mc@key}{}%
  240.   \edef\mc@curhead{\mc@key}%
  241.   \ifmc@first
  242.     \mc@firstfalse
  243.     \edef\mc@list{\mc@key}%
  244.   \else
  245.     \edef\mc@list{\mc@list,\mc@key}%
  246.   \fi}
  247. %    \end{macrocode}
  248. %    \begin{macrocode}
  249. \def\mc@dotail{%
  250.   \mc@ifhead{\mc@key}%
  251.     {\PackageWarning{mcite}%
  252.        {tail `\mc@key' already used as head}}%
  253.     {}%
  254.   \mc@tail{\mc@key}{\mc@curhead}}
  255. %    \end{macrocode}
  256. %    \begin{macrocode}
  257. \def\mc@ifstar#1#2\sentinel#3#4{%
  258.   \ifx*#1%
  259.     \def\mc@key{#2}%
  260.     #3%
  261.   \else
  262.     \def\mc@key{#1#2}%
  263.     #4%
  264.   \fi}
  265. %    \end{macrocode}
  266. %    \begin{macrocode}
  267. \newif\ifmc@first
  268. %    \end{macrocode}
  269. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  270. % \subsection{Producing the Output}
  271. % The simplest approach is to just drop the |\@bibitem| if we're
  272. % processing a continuation (it is just an |\item| with associated
  273. % |.aux| file action):
  274. %    \begin{macrocode}
  275. \let\orig@bibitem\@bibitem
  276. \def\@bibitem#1{%
  277. %    \end{macrocode}
  278. % If the \BibTeX{} style supports \MCITE/, we have to provide
  279. % punctuation ourselves.
  280. %    \begin{macrocode}
  281.   \ifmc@bstsupport
  282.     \mc@iftail{#1}%
  283.       {;\space\ignorespaces}%
  284.       {\ifmc@first\else.\fi\orig@bibitem{#1}}
  285.     \mc@firstfalse
  286.   \else
  287.     \mc@iftail{#1}%
  288.       {\ignorespaces}%
  289.       {\orig@bibitem{#1}}%
  290.   \fi}%
  291. %    \end{macrocode}
  292. %    \begin{macrocode}
  293. \newif\ifmc@bstsupport
  294. \mc@bstsupportfalse
  295. %    \end{macrocode}
  296. % We can't handle |\bibitem|s with an optional argument; tell the user.
  297. %    \begin{macrocode}
  298. \def\@lbibitem[#1]#2{%
  299.   \PackageError{mcite}%
  300.     {You can't use the optional argument of \protect\bibitem}%
  301.     {Hey, *I* have to fool around with the labels!}%
  302.   \@bibitem{#2}}
  303. %    \end{macrocode}
  304. % The |mcbibliography| environment instructs \MCITE/ to provide its
  305. % own punctuation.
  306. %    \begin{macrocode}
  307. \def\mcbibliography{%
  308.   \mc@bstsupporttrue
  309.   \mc@firsttrue
  310.   \thebibliography}
  311. \def\endmcbibliography{%
  312.   \endthebibliography}
  313. %    \end{macrocode}
  314. % That's it!
  315. %    \begin{macrocode}
  316. %</package>
  317. %    \end{macrocode}
  318. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  319. % \Finale
  320. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  321. % \bibliography{mcite}
  322. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  323. % \PrintIndex
  324. % \PrintChanges
  325. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  326. % \appendix
  327. % \section{Driver File}
  328. % In general we will of course format this documentation with itself.
  329. %    \begin{macrocode}
  330. %<*driver>
  331. \documentclass[a4paper]{article}
  332. \usepackage{doc}
  333. \usepackage{mcite}
  334. \EnableCrossrefs
  335. \RecordChanges
  336. \CodelineIndex
  337. \makeatletter
  338. \def\bitem#1{\item[\@biblabel{#1}]}
  339. \makeatother
  340. \def\MCITE/{\texttt{mcite}}
  341. \DoNotIndex{\\,\advance,\baselineskip,\batchmode,\begin,\catcode,\char}
  342. \DoNotIndex{\CodelineIndex,\csname,\def,\divide,\docdate,\DocInput}
  343. \DoNotIndex{\documentclass,\else,\emph,\EnableCrossrefs,\end,\endcsname}
  344. \DoNotIndex{\errmessage,\errorstopmode,\expandafter,\fbox,\fi,\filedate}
  345. \DoNotIndex{\filename,\fileversion,\font,\fontencoding,\fontfamily}
  346. \DoNotIndex{\fontseries,\fontshape,\fontsize,\gdef,\goodbreak,\hfil}
  347. \DoNotIndex{\hoffset,\hskip,\ifcase,\ifx,\InputIfFileExists,\item,\let}
  348. \DoNotIndex{\line,\LoadClass,\makebox,\mbox,\multiply,\NeedsTeXFormat}
  349. \DoNotIndex{\newdimen,\newenvironment,\newif,\nobreak,\normalfont}
  350. \DoNotIndex{\normalsize,\nullfont,\or,\oval,\pagestyle,\par,\parbox}
  351. \DoNotIndex{\parindent,\parskip,\PassOptionsToClass,\ProcessOptions}
  352. \DoNotIndex{\ProvidesClass,\put,\quad,\raisebox,\RecordChanges,\relax,\rule}
  353. \DoNotIndex{\selectfont,\space,\ss,\texttt,\textwidth,\the,\thispagestyle}
  354. \DoNotIndex{\topmargin,\usepackage,\voffset,\vskip,\vspace,\wlog}
  355. \begin{document}
  356.   \bibliographystyle{unsrt}%%%{physics}
  357.   \DocInput{mcite.dtx}
  358. \end{document}
  359. %</driver>
  360. %    \end{macrocode}
  361. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  362. % \section{Copying}
  363. % \label{sec:GPL}
  364. % \MCITE/ is free software; you can redistribute it and/or modify it
  365. % under the terms of the GNU General Public License as published by 
  366. % the Free Software Foundation; either version 2, or (at your option)
  367. % any later version.
  368. % \MCITE/ is distributed in the hope that it will be useful, but
  369. % \emph{without any warranty}; without even the implied warranty of
  370. % \emph{merchantability} or \emph{fitness for a particular purpose}.
  371. % See the GNU General Public License for more details.
  372. % You should have received a copy of the GNU General Public License
  373. % along with this program; if not, write to the Free Software
  374. % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  375. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  376. \endinput
  377. Local Variables:
  378. mode:LaTeX
  379. fill-prefix:"% "
  380. page-delimiter:"^%%%%%%%%%%%*\n"
  381.